#ifndef ITEM_H
#define ITEM_H
#include <string>
#include <unordered_map>
#include "Player.h"

using namespace std;
//装备列表最大数值
const int LISTCOUNT = 10;
//装备列表
const string WEAPONLIST[LISTCOUNT] = { "剑","弓箭","铠甲","盾牌","鞋子","头盔","护腿" };
// 装备槽位枚举
enum class EquipSlot {
	Weapon,   // 武器槽
	Head,     // 头部槽
	Torso,    // 躯干槽
	Foot,     // 脚部槽
	Legs,     // 腿部槽
	Deputy,   // 副手槽
	Accessory // 饰品槽
};

class Item {
public:
	Item(string name="", int value=0, int san=0, int power=0, double movePower=0,
		int wisdom=0, double accuracy=0, int luck=0, int hitPoints=0, int armor=0);

	//打印属性（虚函数)
	virtual void showInfo();
	//获取名字
	string getName() const;
	//获取价值
	int getValue() const;
	//获取理智
	int getSan() const;
	//获取力量
	int getPower()const;
	//获取敏捷
	double getMovePower()const;
	//获取智力
	int getWisdom()const;
	//获取准确度
	double getAccuracy()const;
	//获取幸运值
	int getLuck()const;
	//获取生命值
	int getHitPoints()const;
	//获取护甲
	int getArmor()const;
	//设置名字
	void setName(string name);
	//设置价值
	void setValue(int value);
	//设置理智
	void setSan(int san);
	//设置力量
	void setPower(int power);
	//设置敏捷
	void setMovePower(double movePower);
	//设置智力
	void setWisdom(int wisdom);
	//设置准确度
	void setAccuracy(double accuracy);
	//设置幸运值
	void setLuck(int luck);
	//设置生命值
	void setHitPoints(int hitPoints);
	// 设置护甲
	void setArmor(int armor);

private:
	//名称
	string name;
	//价值
	int value;
	//理智
	int san;
	//力量
	int power;
	//敏捷（躲避）
	double movePower;
	//智力
	int wisdom;
	//准确度
	double accuracy;
	//幸运
	int luck;
	//生命
	int hitPoints;
	//护甲
	int armor;
};

class Equipment :public Item {
public:
	//构造函数初始化武器的名称和价值和属性等
	Equipment(string name, int value, int san, int power, double movePower,
		int wisdom, double accuracy, int luck, int hitPoints, int armor, int consume) :
		Item(name, value, san, power, movePower, wisdom, accuracy, luck, hitPoints, armor) {
		index = 0;
		this->consume = consume;
		slot = EquipSlot::Weapon;
	}
	//复制构造函数
	Equipment(const Equipment& equipment);
	Equipment();
	//获取耐久度
	int getConsume()const;
	//打印武器属性
	void showInfo();
	//通过武器给定编号判断种类，通过价值判断属性的多少
	void initEquipment(int index, int money);
	//获取装备槽位名称
	string slotToString(EquipSlot slot);
	//展示装备槽位上的装备
	void showEquippedItems();
	//获取现在装备的槽位
	EquipSlot getSlot()const;
	//设置槽位
	void setSlot(EquipSlot slot);
	//判断某一槽位是否有装备占用
	bool hasEquipment(EquipSlot slot);
	//卸下某一槽位的装备并将装备放入背包
	Equipment* unEquipPart(EquipSlot slot);
	//用于存放装备的槽位
	unordered_map<EquipSlot, Equipment*>equippedItems;
private:
	//耐久
	int consume;
	//0：剑 1：弓箭 2：铠甲 3：盾牌 4; 鞋子 5：头盔 6：护腿
	int index;
	EquipSlot slot;
	
};

class Drug :public Item {
public:
	//打印药水属性
	void showInfo();
	//药水名字、价值、种类、恢复力
	Drug(string name, int value, char type, int resilience);
	//获取药水类型
	char getType()const;
	//获取恢复力
	int getResilience()const;

private:
	//种类'H'生命，‘S’理智，‘M’魔力
	char type;
	//恢复力
	int resilience;
};

class Special :public Item {
public:
	//特殊物品名称，用途，是否为一次性消耗品
	Special(string name, string purpose, bool isConsumable)
		:Item(name, 0, 0, 0, 0, 0, 0, 0, 0, 0)
	{
		this->purpose = purpose;
		this->isConsumable = isConsumable;
		this->isUsed = isUsed;
	}
	//复制函数
	Special(const Special& special);
	//获取用途
	string getPurpose()const;
	//获取信息：是否可消耗
	bool getIsConsumable()const;
	//检查是否被使用
	bool getIsUsed()const;
	//使用物品
	bool use();
	//重置物品状态
	void reSet();
	//书写物品信息
	void showInfo();

private:
	//物品用途
	string purpose;
	//是否为一次性消耗品
	bool isConsumable;
	//（物品是否被使用）跟踪状态
	bool isUsed;
};


#endif
